/**
 * 
 */
package com.monkeyboy.security.social.qq;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.social.config.annotation.EnableSocial;
import org.springframework.social.config.annotation.SocialConfigurerAdapter;
import org.springframework.social.connect.ConnectionFactoryLocator;
import org.springframework.social.connect.web.ProviderSignInUtils;
import org.springframework.social.security.SpringSocialConfigurer;

/**
 * @Description 社交登录的主配置类
 * @author Gavin<br>
 *         2019年8月27日
 */
@Configuration
@EnableSocial
@Order(1) // 注意，这儿需要优先配置优先级，否则就不会初始化JdbcUsersConnectionRepository这个组件而是初始化的InMemoryUsersConnectionRepository这个组件
public class SocialConfig extends SocialConfigurerAdapter {

	// 社交登录的配置类，就是访问/qqLogin/qq就跳转到第三方进行登录，如果已经授权就登录成功，如果未授权就跳转到/signup.html进行注册或者绑定操作（拦截器的入口，需要配置到拦截器链里面）
	@Bean
	public SpringSocialConfigurer mySpringSocialConfigurer() {
		String filterProcessesUrl = "/qqLogin";// 自定义授权跳转的路径(注意这个路径+providerId需要与QQ互联里面配置的路径相同，这儿最好是设置一个通用login名称，因为是公用的一个路径，qq，微信都需要这个路径，只要providerId不同即可)，授权完后会跳回这个地址，本例子为：redirect_uri=/qqlogin/qq
		MySpringSocialConfigure springSocialConfigurer = new MySpringSocialConfigure(filterProcessesUrl);// 注意这里的路径不能加上providerId标识，不然会被普通拦截器拦截掉
		springSocialConfigurer.signupUrl("/signup.html");
		return springSocialConfigurer;
	}

	// 处理注册流程的工具类，
	// 可以通过这个工具获取到connection里面的一些数据（只针对在注册或者绑定的时候），详情请看控制器中的/user/social/user
	@Bean
	public ProviderSignInUtils providerSignInUtils(ConnectionFactoryLocator connectionFactoryLocator) {
		return new ProviderSignInUtils(connectionFactoryLocator,
				getUsersConnectionRepository(connectionFactoryLocator));
	}
}
